<?php

	require_once("src/view/PageView.php");	
	require_once("src/view/LoginForm.php"); 
	require_once("src/view/LoggedInView.php");	
	require_once("src/model/Loginvalidation.php");


class MasterController
{	
 
    /**
 	* @var string. $html, The html we'll echo out.	 
 	*/
	private $html = "";
	
	/**
 	*  @var PageView Objekt. $pageView,
 	*/
	private $pageView;
	
	/**
 	*  @var LoginForm Objekt.  $loginForm,
 	*/
	private $loginForm;
	
	/**
 	*  @var  LoggedInView Objekt. $loggedInPage,
 	*/
	private $loggedInPage;
	
	/**
 	*  @var  loginvalidation Objekt. $loginvalidation,
 	*/
	private $loginvalidation;
	
		
	public function __construct()
	{
 		$this->pageView = new PageView();
		$this->loginvalidation = new Loginvalidation();
		$this->loginForm = new LoginForm($this->loginvalidation);
		$this->loggedInPage = new LoggedInView(); 
		
	}
	
	
	/**
	 * @return string, the html to display.
	 */	
	public function CheckWhatHTMLToShow() // TODO: lång jäkel
	{
		$this->CheckIfPost($this->loginForm->GetUsername(), 
	                 	   $this->loginForm->GetUserPassword());

		$this->loginvalidation->DefaultIPandUserAgentValues();
		
		$sessionLogin = $this->loginvalidation->GetLoginSession();
		$sessionMessage = $this->loginvalidation->GetMessageSession();
		$sessionLastEnteredUsername = $this->loginvalidation->GetLastEnteredUsernameSession();
		
		if($this->loginvalidation->CheckForSessionHijack())
		{	
			$this->SessionHijack(); 
		}
		elseif($this->loginForm->OnlyOneCookiesExists() || $this->loginForm->AreLoginCookiesSet())
		{ 
			$this->GetCookieHTML($sessionLogin, $sessionLastEnteredUsername);
		}
		elseif(!$this->loginForm->OnlyOneCookiesExists() && !$this->loginForm->AreLoginCookiesSet())
		{
			if($sessionLogin === true && !$this->loginForm->isLogedOut()) //TODO, har med VIEW att göra. 'logout'
			{
				$this->GetLoginPage($sessionLastEnteredUsername, $sessionMessage);										    	
			}
			elseif($this->loginForm->isLogedOut())   
		    {
				if($sessionLogin === true)
				{
					$this->GetLoginForm("Du har lyckats logga ut!",""); 				
					$this->loginForm->DestroyLoginCookies(); 
					$this->loginvalidation->weJustLoggedOut();
				}
				else // om någon skriver logout i urlen. när vi inte är inloggade.
				{
					$this->GetLoginForm("",""); 
				}			
		    }
		    elseif(!$this->loginForm->isLogedOut() && $sessionLogin === true)
			{
				$this->GetLoginForm($sessionMessage, $sessionLastEnteredUsername);
			}
			elseif($this->loginForm->isLogin() && $sessionLogin === false) 
			{
				$this->GetLoginForm($sessionMessage, $sessionLastEnteredUsername);
			}     
			else 
			{
				$this->GetLoginForm("","");
			}
		}
		return $this->html;
	}


	/**
	 * 
	 * @param $sessionLogin string
	 * @param $sessionLastEnteredUsername string
	 */
	 
	private function GetCookieHTML($sessionLogin,$sessionLastEnteredUsername)   
	{
		if($this->CookiesAreOK() && $sessionLogin === false &&
		!$this->loginForm->isLogedOut())
		{
			// Kollar igenom våra kakor ordentligt, om OK, så är vi inloggade, annars
			// har precis loggat in.
			$this->CookieLogin();
		}
		elseif($this->CookiesAreOK() && $sessionLogin === true &&
		!$this->loginForm->isLogedOut())
		{
			// då var vi redan inloggade, men har skapat kakor som är validera och OK.
			$this->GetLoginPage($sessionLastEnteredUsername, ""); 
			
		}
		elseif($this->loginForm->isLogedOut())
		{
			// då loggas vi bara ut.
			$this->GetLoginForm("Du har lyckats logga ut!",""); 				
			$this->loginForm->DestroyLoginCookies(); 
			$this->loginvalidation->weJustLoggedOut();
		}
		else
		{
			// alltid.. alltid om det finns en elr flera kakor, och inget av dem ovanstående
			// är sanna, så är det dålig(a) kak(a/or).
			$this->BadCookies();
		}
	}





	private function CheckIfPost() 
	{
		$this->loginvalidation->giveValues($this->loginForm->GetUsername(), 
					                 	   $this->loginForm->GetUserPassword());
		
		if($_SERVER['REQUEST_METHOD'] == 'POST' && !$this->loginvalidation->GetLoginSession()) 
		{	
			$validUsername = $this->loginvalidation->IsUsernameMissing();
			$validPassword = $this->loginvalidation->IsPasswordMissing();
		     
		    if(!$validUsername && !$validPassword)
		    {
				$this->loginvalidation->CheckLoginInfo($this->loginForm->RememberMe());
			}
		}
	}




	private function SessionHijack()
	{
		$this->loginForm->DestroyLoginCookies(); 
		$this->GetLoginForm("Tjuvjävel!",""); 		
		
	}
	



	//TODO FIXA DEHÄR, SÄTT I MODELLEN.
	private function BadCookies()
	{
		$this->loginForm->DestroyLoginCookies();   
		$this->loginvalidation->weJustLoggedOut();
		$this->GetLoginForm("Fiffla inte med kakorna!",""); 
	}


	private function CookieLogin()
	{	
		$this->loginvalidation->weJustLoggedIn($this->loginForm->GetCookieUsername()); 
		$this->GetLoginPage($this->loginvalidation->GetLastEnteredUsernameSession(), "VI KOM IHÅG DIG!");
	}
    


	/**
	 * @param $formMessage string
	 * @param $lastEnteredUsername string
	 */
	public function GetLoginForm($formMessage, $lastEnteredUsername)
	{	
		$theLoginForm = $this->loginForm->GetForm($formMessage,$lastEnteredUsername);									
		$this->html = $this->pageView->HtmlPage("Laboration2PHP", "", $theLoginForm);
	}


	public function GetLoginPage($LastEntUsername, $message)
	{	
		$loggedInHTML = $this->loggedInPage->LoggedInPage($LastEntUsername, $message);	
		$this->html = $this->pageView->HtmlPage("Laboration2PHP1", "", $loggedInHTML);
	}
	
	
	
		//TODOO KOLLA HUR VI SKA GÖRA OM, KALLA PÅ EN MODELL KLASS ISTÄLLET.
	/** 
	 * @return boolean.
	 */	
	public function CookiesAreOK()
	{
		if($this->loginForm->CookiesExistsAndAreOK())
		{
			return true;
		}
		else 
		{ 
			return false;		
		}		
	}	
	
	

	
	

	
	
	
	
	
}
	
	
	
	
	
	
	
	